package com.kk.netty.nio.network.selector;

import lombok.extern.slf4j.Slf4j;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.util.Iterator;
import java.util.Set;

@Slf4j
public class AcceptService {
    public static void main(String[] args) throws IOException {
        // 1、创建 selector 管理多个 channel
        Selector selector = Selector.open ( );
        ServerSocketChannel channel = ServerSocketChannel.open ( );
        channel.configureBlocking (false);

        // 2、建立 selector 和 channel 的联系(注册)
        channel.register (selector, SelectionKey.OP_ACCEPT);
        // SelectionKey 当事件发生后，通过它得到事件类型 和 哪个 channel 发生了该事件
        SelectionKey ckey = channel.register (selector, 0, null);

        // key 只关注 accept 事件
        // interestOps 只关注
        ckey.interestOps (SelectionKey.OP_ACCEPT);
        log.debug ("register key:{}", ckey);
        channel.bind (new InetSocketAddress (8080));

        while (true) {
            // 3、select 方法，没有事件发生，线程阻塞；有事件，才恢复运行
            //select 在事件未处理的时候，它不会阻塞；事件发生后，要么处理或者取消，不能置之不理
            selector.select ( );

            // 4、处理事件，selectedKey 内部包含了所有发生的事件
            Set<SelectionKey> keys = selector.selectedKeys ( );
            // 遍历所有事件，逐一处理
            Iterator<SelectionKey> iter = keys.iterator ( );
            while (iter.hasNext ( )) {
                SelectionKey key = iter.next ( );
                key.cancel ( );
            }
        }

    }
}
